<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://best.openssf.org/assets/css/style.css">
<link rel="stylesheet" href="checker.css">
<script src="checker.js"></script>
<script src="assert.js"></script>
<link rel="license" href="https://creativecommons.org/licenses/by/4.0/">

<!-- See create_labs.md for how to create your own lab! -->

</head>
<body>
<!-- For GitHub Pages formatting: -->
<div class="container-lg px-3 my-5 markdown-body">
<h1>ラボ演習 assert</h1>
<p>
これはセキュアなソフトウェア開発に関するラボ演習です。
ラボの詳細については、<a href="ja_introduction.html" target="_blank">概要</a>をご覧ください。

<p>
<h2>タスク</h2>
<p>
<b>攻撃者が容易にアサーションを失敗させられないように、サンプルコードを修正してください。</b>

<p>
<h2>背景</h2>
<p>
この演習では、<a href="https://en.wikipedia.org/wiki/Spring_Framework">
Spring フレームワーク</a>を使用する Java のサーバサイドアプリケーション
を修正します。
<!--
Spring Framework is OSS (Apache 2.0 licensed) and listed
as a top one at <https://radixweb.com/blog/best-java-frameworks>.
We aren't advocating any specific framework, just using
real-world frameworks as an example.
-->

<p>
<h2>タスクの詳細</h2>
<p>

<p>
以下のサンプルコードでは、入力検証に失敗するとアサーションが失敗します。
このアプローチでは<i>確実に</i>入力検証が行われ、検証に失敗した入力は確実に拒否されます。
しかしこの実装では、アサーションの失敗によりプログラムの<i>全てが</i>停止します。
検証を失敗させる些細な入力を送り込むことができれば、攻撃者はプログラム全体を
容易にシャットダウンできることになります。

<p>
フォームの入力検証にエラーがないことをアサーションする代わりに、
エラーがあるかどうかをチェックし、もしエラーがあれば <tt> form </tt> という文字列を返す
ように以下のコードを変更してください。（これによりフレームワークは入力フォームを表示します）
誤った入力があった場合、通常はシステム全体をクラッシュさせるよりも入力フォームを再表示
するべきです。


<p>
必要に応じて、「ヒント」ボタンと「諦める」ボタンを使用してください。

<p>
<h2>演習 (<span id="grade"></span>)</h2>
<p>
<form id="lab">
<pre><code
>@Controller
public class WebController implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/results").setViewName("results");
    }

    @GetMapping("/")
    public String showForm(PersonForm personForm) {
        return "form";
    }

    @PostMapping("/")
    public String checkPersonInfo(@Valid PersonForm personForm,
                                  BindingResult bindingResult) {
<textarea id="attempt0" rows="3" cols="60" spellcheck="false"
>        assert !bindingResult.hasErrors();</textarea>

        return "redirect:/results";
    }
}

// If you use a textarea:
</code></pre>
<button type="button" class="hintButton">Hint</button>
<button type="button" class="resetButton">Reset</button>
<button type="button" class="giveUpButton">Give up</button>
<br><br>
<p>
<i>このラボは、<a href="https://www.linuxfoundation.org/">Linux Foundation</a>のDavid A. Wheelerによって開発されました。</i>
これは Spring.io ガイドの
<a href="https://spring.io/guides/gs/validating-form-input">validating-form-input</a>
セクションを基にしています。
<br><br>
<p id="correctStamp" class="small">
<textarea id="debugData" class="displayNone" rows="20" cols="65" readonly>
</textarea>
</form>
</div><!-- End GitHub pages formatting -->
</body>
</html>
